export default {
    namespaced: true,
    state: {
      // 购物车数组  获取本地存储中购物车数组
      cartList: uni.getStorageSync("cartList") || []
    },
    // 相当于 vuex中的计算属性！！！ 
    getters: {
      // 购物车的商品总数量
      cartCount(state) {
        let count = 0;
        state.cartList.forEach((goods) => {
          count += goods.num;
        });
        return count;
      },
      // 计算 当前全选按钮是否要选中  =   数组里面的商品 是否都是 checked=true
    // every!!!!!
    // every 会对数组做遍历！！ 
    // every 返回值 是 true 或者 false
    // 如果 every里面的回调函数 每一个都返回了true =>every 返回值 也是true 
      isAllChecked(state) {
      // 逻辑与，两边为true才为true，一边为false就为false，当第一个条件为false时，就不再判断后面的条件
      return state.cartList.length && state.cartList.every(goods => goods.checked);
      },
      // 计算要购买的商品总数量
      totalCount(state) {
        let totalCount = 0
        state.cartList.forEach(goods => {
          if (goods.checked) {
            totalCount+=goods.num
          }
        })
        return totalCount
      },
      // 计算总价格
      totalPrice(state) {
        let totalPrice = 0
        state.cartList.forEach(goods => {
          if (goods.checked) {
            totalPrice+=goods.num*goods.goods_price
          }
        })
        return totalPrice
      },
      // 选中商品数组
      checkedCartList(state) {
        // 用过滤器选出被选中的返回到这个数组中
       return state.cartList.filter(item=>item.checked)
      }
    },
    mutations: {
      // 添加商品
      // payload= {value:当前要添加的商品对象 }
      cartAdd(state, payload) {
        // 判断当前数据是否存在于数组中 
  
        const index = state.cartList.findIndex(goods => goods.goods_id === payload.value.goods_id);
        if (index === -1) {
          // 不存在  数组push 
          state.cartList.push({ ...payload.value, num: 1,checked:true });
        } else {
          // 存在 修改数组中元素的购买数量即可
          state.cartList[index].num++
        }
        // 存一份到缓存中
        uni.setStorageSync("cartList", state.cartList)
      },
       // 根据商品的id做切换选中
       cartToggleCheck(state, payload) {
        /* 
        1 根据商品的id 找到元素在数组中的位置 下标 index 
        2 数组[下标].checked = ! 数组[下标].checked;
        3 存一份到缓存中
         */
        const index = state.cartList.findIndex(goods => goods.goods_id === payload.value)
        state.cartList[index].checked = !state.cartList[index].checked;
        // 存一份到缓存中
        uni.setStorageSync("cartList", state.cartList)
      },
      //  根据商品id做数量更新
      cartNumUpdate(state, payload) {
         // 1 根据商品的id 找到元素在数组中的位置 下标 index 
        const index = state.cartList.findIndex(goods => goods.goods_id === payload.value.goods_id)
        // 2 数组[下标].num+=-1
        state.cartList[index].num += payload.value.unit
            // 存一份到缓存中
        uni.setStorageSync("cartList", state.cartList)
      },
      // 根据商品的id，删除数组中元素
        cartItemDelete(state, payload) {
      const index = state.cartList.findIndex(goods => goods.goods_id === payload.value)
      state.cartList.splice(index, 1);
      uni.setStorageSync("cartList", state.cartList)
      },
     // 根据当前全选状态 来设置 购物车元素中商品的选中状态
    cartAllToggle(state, payload) {
      // mutations 获取到 getters里面的属性
      // arguments 获取到 该方法的所有的形参  原生js就支持
      // 获取到取反后的 全选状态
      const isAllChecked = !payload.value;
      state.cartList.forEach(goods => goods.checked = isAllChecked);
      uni.setStorageSync("cartList", state.cartList)
    }
    },
    actions: {
  
    }
  }